package com.atguigu.nacos.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.atguigu.nacos.bean.Movie;
import com.atguigu.nacos.handler.SentinelExceptionHandler;
import com.atguigu.nacos.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
@RefreshScope //启动变量的动态刷新功能
//分布式系统的微服务如果要互相远程访问，springcloud支持的是REST风格调用，(HTTP+JSON)
@RestController
public class MovieController {
    @Autowired
    MovieService movieService;
    @Value("${server.port}")
    Integer port;
    //配置中心的dataId文件加载到本地后和application文件的使用方式一样
    @Value("${myName}")
    String myName;
    //连接数据库
    @Value("${mysql.url}")
    String mysqlUrl;
    //连接redis
    @Value("${redis.host}")
    String redisHost;

    //测试热点key(方法的参数，根据参数进行流控限制)流控的方法
    @GetMapping("/testHotKey")
    //fallback 指定异常处理的方法
    @SentinelResource(value = "hotKey",blockHandler = "qpsExceptionHandle"
            ,blockHandlerClass = SentinelExceptionHandler.class)   //给方法提供一个资源名称，在sentinel控制台可以通过资源名对方法进行流控
    public String testHotKey(@RequestParam(value = "p1" , required = false) String p1 ,
                             @RequestParam(value = "p2" , required = false)String p2){
        return "testHotKey response...";
    }
    //自定义异常处理方法：和ribbon类似
//    public String testHotKeyFallback(String p1 ,String p2){
//        return "testHotKeyFallback response...";
//    }

    //连接rabbitmq
    @GetMapping("/test")
    public String test(){
        return "mysqlUrl:"+mysqlUrl+" , redisHost:"+redisHost;
    }
    //连接elasticsearch
    //查询电影信息的方法
    @GetMapping("/getMovie")
    public Movie getMovie(@RequestParam("id")Integer id){
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        int i = 1/0;
        //System.out.println("当前时间："+System.currentTimeMillis());
        System.out.println("myName = " + myName);
        System.out.println("当前被访问的电影服务端口号： "+port);
        return movieService.getMovie(id);
    }


    @GetMapping("/getMovies")
    public List<Movie> getMovies(){
        return null;
    }
}
